package com.jiukuaidao.zhulin.module.pay.alipay;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.text.TextUtils;

import com.alipay.sdk.app.PayTask;
import com.jiukuaidao.zhulin.data.TasksRepository;
import com.jiukuaidao.zhulin.module.BasePresenter;
import com.jiukuaidao.zhulin.module.pay.alipay.util.AliKeys;
import com.jiukuaidao.zhulin.module.pay.alipay.util.OrderInfo;
import com.jiukuaidao.zhulin.module.pay.alipay.util.PayResult;
import com.jiukuaidao.zhulin.module.pay.alipay.util.SignUtils;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

/**
 * Author : PaiTaSuo
 * Date : 2016/5/23
 * Description :
 */
public class PayPresenter extends BasePresenter<PayContract.View, TasksRepository> implements PayContract.Presenter {
    public PayPresenter(TasksRepository repository, PayContract.View view) {
        super(repository, view);
    }


    @Override
    public void start() {

    }

    /**
     * 调用SDK支付
     */

    @Override
    public void pay() {

        if (TextUtils.isEmpty(AliKeys.PARTNER) || TextUtils.isEmpty(AliKeys.RSA_PRIVATE) || TextUtils.isEmpty(AliKeys.SELLER)) {
            new AlertDialog.Builder(mView.getContext()).setTitle("警告").setMessage("需要配置PARTNER | RSA_PRIVATE| SELLER")
                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialoginterface, int i) {

                        }
                    }).show();
            return;
        }
        String orderInfo = OrderInfo.getOrderInfo(mView.getSubiect(), mView.getBody(), mView.getPrice());

        /**
         * 特别注意，这里的签名逻辑需要放在服务端，切勿将私钥泄露在代码中！
         */
        String sign = sign(orderInfo);
        try {
            /**
             * 仅需对sign 做URL编码
             */
            sign = URLEncoder.encode(sign, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        /**
         * 完整的符合支付宝参数规范的订单信息
         */
        final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType();

        Runnable payRunnable = new Runnable() {

            @Override
            public void run() {
                // 构造PayTask 对象
                PayTask alipay = new PayTask((Activity) mView.getContext());
                // 调用支付接口，获取支付结果
                final String result = alipay.pay(payInfo, true);

                ((Activity) mView.getContext()).runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                        PayResult payResult = new PayResult(result);
                        /**
                         * 同步返回的结果必须放置到服务端进行验证（验证的规则请看https://doc.open.alipay.com/doc2/
                         * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
                         * docType=1) 建议商户依赖异步通知
                         */
                        String resultInfo = payResult.getResult();// 同步返回需要验证的信息

                        String resultStatus = payResult.getResultStatus();
                        // 判断resultStatus 为“9000”则代表支付成功，具体状态码代表含义可参考接口文档
                        if (TextUtils.equals(resultStatus, "9000")) {
                            mView.toast("支付成功");
                        } else {
                            // 判断resultStatus 为非"9000"则代表可能支付失败
                            // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认，最终交易是否成功以服务端异步通知为准（小概率状态）
                            if (TextUtils.equals(resultStatus, "8000")) {
                                mView.toast("支付结果确认中");
                            } else {
                                // 其他值就可以判断为支付失败，包括用户主动取消支付，或者系统返回的错误
                                mView.toast("支付失败");
                            }
                        }

                    }
                });
            }
        };


        // 必须异步调用
        Thread payThread = new Thread(payRunnable);
        payThread.start();

    }

    /**
     * 对订单信息进行签名
     *
     * @param content 待签名订单信息
     * @return
     */
    private String sign(String content) {
        return SignUtils.sign(content, AliKeys.RSA_PRIVATE);
    }

    /**
     * 获取签名方式
     *
     * @return
     */
    private String getSignType() {
        return "sign_type=\"RSA\"";
    }

    /**
     * 获取SDK版本号
     */
    public void getSDKVersion() {
        PayTask payTask = new PayTask((Activity) mView.getContext());
        String version = payTask.getVersion();
    }
}
